/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.core.facade;

import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import stud.cp.core.plugins.Plugin;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.plugins.PluginRouter;

/**
 * Класс, отвечающий за координирование
 * работы плагинов.
 * @author Morfant
 */
public class PluginManager {

    /**
     * Логгер.
     */
    private Logger logger = Logger.getLogger("CPTNP");

    /**
     * Метод, отвечающий за выполнение запроса пользователя.
     * Передаеться от сервлета, принявщего этот зарпос.
     * @param servlet Сервлет.
     * @param req Реквест.
     * @return Класс, отвечающий за перенаправление зарпоса.
     */
    public PluginRouter perform(HttpServlet servlet, HttpServletRequest req) {
        //Выделяем из запроса запрашиваемое действие
        String pluginKey = getPluginKey(req);
        if (!pluginKey.equals("")) {//Если ключь не пустой.
            //Связываемся с файлом свойств через констекст сервлета.
            ResourceBundle bundle = (ResourceBundle) servlet.getServletContext().getAttribute("plugin-mappings");
            //Получаем jndi`ое имя плагина, с которым мы будем работать.
            PluginRouter pluginRouter = null;
            try {
                String jndiNameOfPlugin = (String) bundle.getObject(pluginKey);
                Context context = new InitialContext();
                //Дергаем из контекста наш плагин.
                Plugin plugin = (Plugin) context.lookup(jndiNameOfPlugin);
                pluginRouter = plugin.perform(req);
            } catch (MissingResourceException ex) {
                logger.debug("Некоторые ошибки произошли во время работы Plugin Manager`а: ", ex);
            } catch (NamingException ex) {
                logger.debug("Некоторые ошибки произошли во время работы Plugin Manager`а: ", ex);
            }
            if (pluginRouter != null) {
                return pluginRouter;
            } else {
                req.setAttribute(PluginConst.ERROR_MESSAGE, "Плагин не найден.");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, "404 Такая страница не найдена.");
        }
        return new PluginRouter("/errorpage.jsp");
    }

    /**
     * Метод, который преобразует URL, чтобы его можно было использовать
     * для определния какой ему соответствуем плагин.
     * От исходного URL остается та часть, что стоит между "/" и ".".
     * @param req Объект предоставляющий HTTP запрос.
     * @return Строка, представляющая преобразованный URL.
     */
    private String getPluginKey(HttpServletRequest req) {
        String path = req.getServletPath();
        String key = "";
        int slash = path.lastIndexOf("/");
        int period = path.lastIndexOf(".");
        if (period > 0 && period > slash) {
            key = path.substring(slash + 1, period);
        }
        return key;
    }
}
